Visualize Latest Observations from the Ambient Weather Stations#
Imports#
import glob
import xarray as xr
from bokeh.models.formatters import DatetimeTickFormatter
import hvplot.xarray
import holoviews as hv
from distributed import Client
import warnings
warnings.filterwarnings("ignore")
hv.extension('bokeh')
Start up a Dask Cluster#
client = Client()
client
Client
Client-88530c0c-f0f4-11ed-8b4c-6045bd84f9aa
| Connection method: Cluster object | Cluster type: distributed.LocalCluster |
| Dashboard: http://127.0.0.1:8787/status |
Cluster Info
LocalCluster
8553b97d
| Dashboard: http://127.0.0.1:8787/status | Workers: 2 |
| Total threads: 2 | Total memory: 6.78 GiB |
| Status: running | Using processes: True |
Scheduler Info
Scheduler
Scheduler-a4c334da-c248-438b-aa58-9fa9e9961b46
| Comm: tcp://127.0.0.1:44149 | Workers: 2 |
| Dashboard: http://127.0.0.1:8787/status | Total threads: 2 |
| Started: Just now | Total memory: 6.78 GiB |
Workers
Worker: 0
| Comm: tcp://127.0.0.1:33173 | Total threads: 1 |
| Dashboard: http://127.0.0.1:34533/status | Memory: 3.39 GiB |
| Nanny: tcp://127.0.0.1:43443 | |
| Local directory: /tmp/dask-scratch-space/worker-6fatd3x_ | |
Worker: 1
| Comm: tcp://127.0.0.1:35509 | Total threads: 1 |
| Dashboard: http://127.0.0.1:38391/status | Memory: 3.39 GiB |
| Nanny: tcp://127.0.0.1:39773 | |
| Local directory: /tmp/dask-scratch-space/worker-jisupqxa | |
Read the Sorted Data, Using the Last File#
files = sorted(glob.glob('../../data/surface-meteorology/*/*/*/*.nc'))
ds = xr.open_mfdataset(files[-60:])
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[3], line 3
1 files = sorted(glob.glob('../../data/surface-meteorology/*/*/*/*.nc'))
----> 3 ds = xr.open_mfdataset(files[-60:])
File /usr/share/miniconda3/envs/instrument-cookbooks-dev/lib/python3.10/site-packages/xarray/backends/api.py:1010, in open_mfdataset(paths, chunks, concat_dim, compat, preprocess, engine, data_vars, coords, combine, parallel, join, attrs_file, combine_attrs, **kwargs)
997 combined = _nested_combine(
998 datasets,
999 concat_dims=concat_dim,
(...)
1005 combine_attrs=combine_attrs,
1006 )
1007 elif combine == "by_coords":
1008 # Redo ordering from coordinates, ignoring how they were ordered
1009 # previously
-> 1010 combined = combine_by_coords(
1011 datasets,
1012 compat=compat,
1013 data_vars=data_vars,
1014 coords=coords,
1015 join=join,
1016 combine_attrs=combine_attrs,
1017 )
1018 else:
1019 raise ValueError(
1020 "{} is an invalid option for the keyword argument"
1021 " ``combine``".format(combine)
1022 )
File /usr/share/miniconda3/envs/instrument-cookbooks-dev/lib/python3.10/site-packages/xarray/core/combine.py:975, in combine_by_coords(data_objects, compat, data_vars, coords, fill_value, join, combine_attrs, datasets)
973 concatenated_grouped_by_data_vars = []
974 for vars, datasets_with_same_vars in grouped_by_vars:
--> 975 concatenated = _combine_single_variable_hypercube(
976 list(datasets_with_same_vars),
977 fill_value=fill_value,
978 data_vars=data_vars,
979 coords=coords,
980 compat=compat,
981 join=join,
982 combine_attrs=combine_attrs,
983 )
984 concatenated_grouped_by_data_vars.append(concatenated)
986 return merge(
987 concatenated_grouped_by_data_vars,
988 compat=compat,
(...)
991 combine_attrs=combine_attrs,
992 )
File /usr/share/miniconda3/envs/instrument-cookbooks-dev/lib/python3.10/site-packages/xarray/core/combine.py:648, in _combine_single_variable_hypercube(datasets, fill_value, data_vars, coords, compat, join, combine_attrs)
646 indexes = concatenated.indexes.get(dim)
647 if not (indexes.is_monotonic_increasing or indexes.is_monotonic_decreasing):
--> 648 raise ValueError(
649 "Resulting object does not have monotonic"
650 " global indexes along dimension {}".format(dim)
651 )
653 return concatenated
ValueError: Resulting object does not have monotonic global indexes along dimension station
Plot the Data#
formatter = DatetimeTickFormatter(hours="%d %b %Y \n %H:%M UTC")
variables = ['outdoor_temperature', 'outdoor_dewpoint', 'hourlyrainin', 'solarradiation']
panels = []
for variable in variables:
panels.append(ds[variable].hvplot.line(x='time', by='station', xformatter=formatter))
hv.Layout(panels).cols(1)